{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "20d00845",
   "metadata": {},
   "source": [
    "# 深入TA-Lib:量化技术指标详解\n",
    "本文系统讲解TA-Lib技术指标分析，涵盖基础、数据处理、趋势和动量指标、均量线、布林线等，并结合Python代码与大数据、机器学习实战案例，助力量化交易技巧。\n",
    "## 第一章 TA-Lib基础入门  \n",
    "### 1.1 TA-Lib简介与安装\n",
    "#### TA-Lib介绍\n",
    "TA-Lib（Technical Analysis Library）是一个广泛使用的开源技术分析库，支持多种编程语言，包括Python、Java、C++等。它提供了大量的函数，用于计算各种技术指标，如移动平均线、相对强弱指数（RSI）、随机指标（KDJ）等，是金融数据分析和交易策略开发的重要工具。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c6275e28",
   "metadata": {},
   "source": [
    "#### Python环境下TA-Lib安装方法\n",
    "在Python中，安装第三方库常用的方法：\n",
    "`pip install ta-lib`\n",
    "但是根据实际实验，TA-Lib安装需要下载*.whl文件安装，否则有些依赖无法满足，下载[地址](https://github.com/cgohlke/talib-build/releases)。  \n",
    "安装完成后，可以通过以下Python代码验证是否安装成功："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b4898fab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.6.4'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import talib\n",
    "talib.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95bb6433",
   "metadata": {},
   "source": [
    "看到上面的版本号，就说明安装成功了！  \n",
    "### 1.2 初步使用TA-Lib  \n",
    "#### TA-Lib基本函数分类  \n",
    "TA-Lib的函数按照技术指标的类型进行了分类，主要包括以下几类：\n",
    "- **趋势指标**：如移动平均线（MA）、指数移动平均线（EMA）、MACD等，用于判断市场的趋势方向（上升、下降、横盘）。\n",
    "- **动量指标**：如相对强弱指数（RSI）、随机指标（KDJ）等，衡量价格变动的速度和幅度，判断市场是处于“超买”还是“超卖”状态，寻找潜在的反转点。通常在价格达到极端水平或指标出现背离时发出信号。\n",
    "- **均量指标**：如均量线（VMA）、成交量指标（VOL）等，用于分析市场的成交量变换。\n",
    "- **波动性指标**：如布林线（BOLL）等，用于衡量市场的波动性。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cdc8157f",
   "metadata": {},
   "source": [
    "#### 常用函数的调用方式\n",
    "TA-Lib的函数调用方式相对简单，一般需要传入价格数据（如收盘价、开盘价等）和参数（如周期）。以下是一个简单的示例，计算移动平均线："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "31f9b96e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>ma5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>1533.656</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>1529.012</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>1530.406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>1530.116</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>1527.152</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close       ma5\n",
       "4   20241225  1530.00  1533.656\n",
       "3   20241226  1527.79  1529.012\n",
       "2   20241227  1528.97  1530.406\n",
       "1   20241230  1525.00  1530.116\n",
       "0   20241231  1524.00  1527.152"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import tushare as ts \n",
    "import talib\n",
    "\n",
    "# 获取数据\n",
    "# 使用tushare API token\n",
    "ts.set_token(\"b33d3fd63bd24674bea214f523cc0ae0eef475a1f10a69f8eaf66e05\")\n",
    "pro = ts.pro_api()\n",
    "\n",
    "# 获取A股某股票的历史数据，例如贵州茅台（600519）\n",
    "data = pro.daily(ts_code=\"600519.SH\",\n",
    "                 start_date=\"20200101\",\n",
    "                 end_date=\"20241231\")\n",
    "# 将数据按交易日排序\n",
    "data = data.sort_values(\"trade_date\") \n",
    "\n",
    "# 计算5日简单移动平均线\n",
    "data['ma5'] = talib.SMA(data['close'],timeperiod=5)\n",
    "\n",
    "data[[\"trade_date\",\"close\",\"ma5\"]].tail()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53e11a8b",
   "metadata": {},
   "source": [
    "上述示例中，我们使用TA-Lib的SMA函数计算了5日简单移动平均线，并将其添加到数据框中。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "138e2cda",
   "metadata": {},
   "source": [
    "## 第二章 A股数据准备与处理\n",
    "### 2.1 Tushare数据源介绍\n",
    "#### Tushare功能概述\n",
    "Tushare是一个免费、开源的金融数据接口库，提供了丰富的A股市场数据，包括股票行情、财务数据、指数数据等。它支持过重数据获取方式，方便用户快速获取所需数据。\n",
    "#### Tushare安装\n",
    "使用 `pip install tushare`\n",
    "#### 注册账号与获取API Token\n",
    "1.访问Tushare官网（https://tushare.pro/），注册账号。  \n",
    "\n",
    "2.登录后，在个人中心获取API Token。\n",
    "#### 使用Tushare获取A股历史数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "439dbee4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ts_code</th>\n",
       "      <th>trade_date</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>pre_close</th>\n",
       "      <th>change</th>\n",
       "      <th>pct_chg</th>\n",
       "      <th>vol</th>\n",
       "      <th>amount</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1211</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20200102</td>\n",
       "      <td>1128.00</td>\n",
       "      <td>1145.06</td>\n",
       "      <td>1116.00</td>\n",
       "      <td>1130.00</td>\n",
       "      <td>1183.00</td>\n",
       "      <td>-53.00</td>\n",
       "      <td>-4.4801</td>\n",
       "      <td>148099.16</td>\n",
       "      <td>1.669684e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1210</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20200103</td>\n",
       "      <td>1117.00</td>\n",
       "      <td>1117.00</td>\n",
       "      <td>1076.90</td>\n",
       "      <td>1078.56</td>\n",
       "      <td>1130.00</td>\n",
       "      <td>-51.44</td>\n",
       "      <td>-4.5522</td>\n",
       "      <td>130318.78</td>\n",
       "      <td>1.426638e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1209</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20200106</td>\n",
       "      <td>1070.86</td>\n",
       "      <td>1092.90</td>\n",
       "      <td>1067.30</td>\n",
       "      <td>1077.99</td>\n",
       "      <td>1078.56</td>\n",
       "      <td>-0.57</td>\n",
       "      <td>-0.0528</td>\n",
       "      <td>63414.78</td>\n",
       "      <td>6.853918e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1208</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20200107</td>\n",
       "      <td>1077.50</td>\n",
       "      <td>1099.00</td>\n",
       "      <td>1076.40</td>\n",
       "      <td>1094.53</td>\n",
       "      <td>1077.99</td>\n",
       "      <td>16.54</td>\n",
       "      <td>1.5343</td>\n",
       "      <td>47853.59</td>\n",
       "      <td>5.220697e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1207</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20200108</td>\n",
       "      <td>1085.05</td>\n",
       "      <td>1095.50</td>\n",
       "      <td>1082.58</td>\n",
       "      <td>1088.14</td>\n",
       "      <td>1094.53</td>\n",
       "      <td>-6.39</td>\n",
       "      <td>-0.5838</td>\n",
       "      <td>25008.25</td>\n",
       "      <td>2.720372e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        ts_code trade_date     open     high      low    close  pre_close  \\\n",
       "1211  600519.SH   20200102  1128.00  1145.06  1116.00  1130.00    1183.00   \n",
       "1210  600519.SH   20200103  1117.00  1117.00  1076.90  1078.56    1130.00   \n",
       "1209  600519.SH   20200106  1070.86  1092.90  1067.30  1077.99    1078.56   \n",
       "1208  600519.SH   20200107  1077.50  1099.00  1076.40  1094.53    1077.99   \n",
       "1207  600519.SH   20200108  1085.05  1095.50  1082.58  1088.14    1094.53   \n",
       "\n",
       "      change  pct_chg        vol        amount  \n",
       "1211  -53.00  -4.4801  148099.16  1.669684e+07  \n",
       "1210  -51.44  -4.5522  130318.78  1.426638e+07  \n",
       "1209   -0.57  -0.0528   63414.78  6.853918e+06  \n",
       "1208   16.54   1.5343   47853.59  5.220697e+06  \n",
       "1207   -6.39  -0.5838   25008.25  2.720372e+06  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import tushare as ts \n",
    "\n",
    "# 设置tushare API Token\n",
    "ts.set_token(\"b33d3fd63bd24674bea214f523cc0ae0eef475a1f10a69f8eaf66e05\")\n",
    "pro = ts.pro_api()\n",
    "\n",
    "# 获取A股某股票的历史数据，例如贵州茅台（600519）\n",
    "data = pro.daily(ts_code=\"600519.SH\",start_date=\"20200101\",end_date=\"20241231\")\n",
    "data = data.sort_values(\"trade_date\") # 按交易日排序\n",
    "\n",
    "# 查看数据\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99f8b1ba",
   "metadata": {},
   "source": [
    "### 2.2 数据存储与读取  \n",
    "Parquet是一种高效的列式存储格式，适用于大数据处理。它具有高压缩比和快速读取的特点，适合存储大规模数据。要是使用Parquet格式数据，除了需要Pandas库之外，还需要安装PyArrow库，安装方法：`pip install pyarrow`。  \n",
    "#### 使用Python将数据存储为Parquet文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6a31ccdd",
   "metadata": {},
   "outputs": [],
   "source": [
    "import tushare as ts \n",
    "\n",
    "# 设置tushare API Token\n",
    "ts.set_token(\"b33d3fd63bd24674bea214f523cc0ae0eef475a1f10a69f8eaf66e05\")\n",
    "pro = ts.pro_api()\n",
    "\n",
    "# 获取A股某股票的历史数据，例如贵州茅台（600519）\n",
    "data = pro.daily(ts_code=\"600519.SH\",start_date=\"20200101\",end_date=\"20241231\")\n",
    "\n",
    "# 将获取的数据存储为Parquet文件\n",
    "data.to_parquet(\"./data/600519.SH.parquet\",index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "117aef70",
   "metadata": {},
   "source": [
    "#### 从Parquet文件读取数据到DataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f4ad4ff3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ts_code</th>\n",
       "      <th>trade_date</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>pre_close</th>\n",
       "      <th>change</th>\n",
       "      <th>pct_chg</th>\n",
       "      <th>vol</th>\n",
       "      <th>amount</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241231</td>\n",
       "      <td>1525.40</td>\n",
       "      <td>1545.00</td>\n",
       "      <td>1522.01</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>-1.00</td>\n",
       "      <td>-0.0656</td>\n",
       "      <td>39354.45</td>\n",
       "      <td>6033540.366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241230</td>\n",
       "      <td>1533.97</td>\n",
       "      <td>1543.96</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>-3.97</td>\n",
       "      <td>-0.2597</td>\n",
       "      <td>25129.82</td>\n",
       "      <td>3849542.646</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.90</td>\n",
       "      <td>1536.00</td>\n",
       "      <td>1519.50</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>1.18</td>\n",
       "      <td>0.0772</td>\n",
       "      <td>20759.32</td>\n",
       "      <td>3170191.445</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241226</td>\n",
       "      <td>1534.00</td>\n",
       "      <td>1538.78</td>\n",
       "      <td>1523.00</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>-2.21</td>\n",
       "      <td>-0.1444</td>\n",
       "      <td>18286.51</td>\n",
       "      <td>2798840.003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241225</td>\n",
       "      <td>1538.80</td>\n",
       "      <td>1538.80</td>\n",
       "      <td>1526.10</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>1538.82</td>\n",
       "      <td>-8.82</td>\n",
       "      <td>-0.5732</td>\n",
       "      <td>17123.39</td>\n",
       "      <td>2621061.878</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     ts_code trade_date     open     high      low    close  pre_close  \\\n",
       "0  600519.SH   20241231  1525.40  1545.00  1522.01  1524.00    1525.00   \n",
       "1  600519.SH   20241230  1533.97  1543.96  1525.00  1525.00    1528.97   \n",
       "2  600519.SH   20241227  1528.90  1536.00  1519.50  1528.97    1527.79   \n",
       "3  600519.SH   20241226  1534.00  1538.78  1523.00  1527.79    1530.00   \n",
       "4  600519.SH   20241225  1538.80  1538.80  1526.10  1530.00    1538.82   \n",
       "\n",
       "   change  pct_chg       vol       amount  \n",
       "0   -1.00  -0.0656  39354.45  6033540.366  \n",
       "1   -3.97  -0.2597  25129.82  3849542.646  \n",
       "2    1.18   0.0772  20759.32  3170191.445  \n",
       "3   -2.21  -0.1444  18286.51  2798840.003  \n",
       "4   -8.82  -0.5732  17123.39  2621061.878  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "# 从Parquet文件读取数据\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 显示数据\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60635735",
   "metadata": {},
   "source": [
    "### 2.3 数据的清洗与处理\n",
    "#### 处理缺失数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8ba670eb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始的DataFrame\n",
      "     A    B  C\n",
      "0  1.0  NaN  1\n",
      "1  2.0  2.0  2\n",
      "2  NaN  3.0  3\n",
      "3  NaN  NaN  4\n",
      "4  5.0  5.0  5\n",
      "检查缺失值\n",
      "A    2\n",
      "B    2\n",
      "C    0\n",
      "dtype: int64\n",
      "填充后的DataFrame\n",
      "     A    B  C\n",
      "0  1.0  NaN  1\n",
      "1  2.0  2.0  2\n",
      "2  2.0  3.0  3\n",
      "3  2.0  3.0  4\n",
      "4  5.0  5.0  5\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "# 创建一个NaN的DataFrame\n",
    "df = pd.DataFrame({\n",
    "    'A':[1,2,np.nan,np.nan,5],\n",
    "    'B':[np.nan,2,3,np.nan,5],\n",
    "    'C':[1,2,3,4,5]\n",
    "})\n",
    "print(\"原始的DataFrame\")\n",
    "print(df)\n",
    "\n",
    "# 检查缺失值\n",
    "print(\"检查缺失值\")\n",
    "print(df.isnull().sum())\n",
    "\n",
    "# 填充缺失值，例如用前一个非缺失值填充\n",
    "df.ffill(inplace=True)\n",
    "print(\"填充后的DataFrame\")\n",
    "print(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8753d43b",
   "metadata": {},
   "source": [
    "#### 数据类型转换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "348fc0f2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ts_code</th>\n",
       "      <th>trade_date</th>\n",
       "      <th>vol</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241231</td>\n",
       "      <td>39354.45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241230</td>\n",
       "      <td>25129.82</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241227</td>\n",
       "      <td>20759.32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241226</td>\n",
       "      <td>18286.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241225</td>\n",
       "      <td>17123.39</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     ts_code trade_date       vol\n",
       "0  600519.SH   20241231  39354.45\n",
       "1  600519.SH   20241230  25129.82\n",
       "2  600519.SH   20241227  20759.32\n",
       "3  600519.SH   20241226  18286.51\n",
       "4  600519.SH   20241225  17123.39"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[['ts_code','trade_date','vol']].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fee94d18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ts_code</th>\n",
       "      <th>trade_date</th>\n",
       "      <th>vol</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241231</td>\n",
       "      <td>39354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241230</td>\n",
       "      <td>25129</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241227</td>\n",
       "      <td>20759</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241226</td>\n",
       "      <td>18286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>20241225</td>\n",
       "      <td>17123</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     ts_code trade_date    vol\n",
       "0  600519.SH   20241231  39354\n",
       "1  600519.SH   20241230  25129\n",
       "2  600519.SH   20241227  20759\n",
       "3  600519.SH   20241226  18286\n",
       "4  600519.SH   20241225  17123"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将vol转换为整型\n",
    "data['vol'] = data['vol'].astype(int)\n",
    "data[['ts_code','trade_date','vol']].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0211491a",
   "metadata": {},
   "source": [
    "#### 时间序列对齐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6dc1b99b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ts_code</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>pre_close</th>\n",
       "      <th>change</th>\n",
       "      <th>pct_chg</th>\n",
       "      <th>vol</th>\n",
       "      <th>amount</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>trade_date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>20200102</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>1128.00</td>\n",
       "      <td>1145.06</td>\n",
       "      <td>1116.00</td>\n",
       "      <td>1130.00</td>\n",
       "      <td>1183.00</td>\n",
       "      <td>-53.00</td>\n",
       "      <td>-4.4801</td>\n",
       "      <td>148099</td>\n",
       "      <td>1.669684e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20200103</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>1117.00</td>\n",
       "      <td>1117.00</td>\n",
       "      <td>1076.90</td>\n",
       "      <td>1078.56</td>\n",
       "      <td>1130.00</td>\n",
       "      <td>-51.44</td>\n",
       "      <td>-4.5522</td>\n",
       "      <td>130318</td>\n",
       "      <td>1.426638e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20200106</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>1070.86</td>\n",
       "      <td>1092.90</td>\n",
       "      <td>1067.30</td>\n",
       "      <td>1077.99</td>\n",
       "      <td>1078.56</td>\n",
       "      <td>-0.57</td>\n",
       "      <td>-0.0528</td>\n",
       "      <td>63414</td>\n",
       "      <td>6.853918e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20200107</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>1077.50</td>\n",
       "      <td>1099.00</td>\n",
       "      <td>1076.40</td>\n",
       "      <td>1094.53</td>\n",
       "      <td>1077.99</td>\n",
       "      <td>16.54</td>\n",
       "      <td>1.5343</td>\n",
       "      <td>47853</td>\n",
       "      <td>5.220697e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20200108</th>\n",
       "      <td>600519.SH</td>\n",
       "      <td>1085.05</td>\n",
       "      <td>1095.50</td>\n",
       "      <td>1082.58</td>\n",
       "      <td>1088.14</td>\n",
       "      <td>1094.53</td>\n",
       "      <td>-6.39</td>\n",
       "      <td>-0.5838</td>\n",
       "      <td>25008</td>\n",
       "      <td>2.720372e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              ts_code     open     high      low    close  pre_close  change  \\\n",
       "trade_date                                                                     \n",
       "20200102    600519.SH  1128.00  1145.06  1116.00  1130.00    1183.00  -53.00   \n",
       "20200103    600519.SH  1117.00  1117.00  1076.90  1078.56    1130.00  -51.44   \n",
       "20200106    600519.SH  1070.86  1092.90  1067.30  1077.99    1078.56   -0.57   \n",
       "20200107    600519.SH  1077.50  1099.00  1076.40  1094.53    1077.99   16.54   \n",
       "20200108    600519.SH  1085.05  1095.50  1082.58  1088.14    1094.53   -6.39   \n",
       "\n",
       "            pct_chg     vol        amount  \n",
       "trade_date                                 \n",
       "20200102    -4.4801  148099  1.669684e+07  \n",
       "20200103    -4.5522  130318  1.426638e+07  \n",
       "20200106    -0.0528   63414  6.853918e+06  \n",
       "20200107     1.5343   47853  5.220697e+06  \n",
       "20200108    -0.5838   25008  2.720372e+06  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 设置交易日期为索引\n",
    "data.set_index('trade_date',inplace=True)\n",
    "\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "370f0d03",
   "metadata": {},
   "source": [
    "## 第三章 趋势指标\n",
    "### 3.1 移动平均线（MA）\n",
    "#### MA理论基础\n",
    "移动平均线（Moving Average,MA）是将某一段时间内的收盘价加以平均，再根据这些平均值绘制而成的曲线。它具有平滑价格曲线、显示趋势方向的特点。常见的移动平均线有简单移动平均线（SMA）和指数移动平均线（EMA）。\n",
    "#### TA-Lib中MA函数\n",
    "- **SMA**：简单移动平均线\n",
    "- **EMA**：指数移动平均线\n",
    "- **WMA**：加权移动平均线\n",
    "- **DEMA**：双重指数移动平均线\n",
    "- **TRIMA**：三角移动平均线\n",
    "- **KAMA**：自适应移动平均线\n",
    "- **MIDPOINT**：中点移动平均线\n",
    "- **MIDPRICE**：价格中点移动平均线\n",
    "\n",
    "#### A股市场中MA实战示例"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85865973",
   "metadata": {},
   "source": [
    "- 使用pandas计算5日移动平均价（SMA）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6863fe4c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Date</th>\n",
       "      <th>Close</th>\n",
       "      <th>SMA_5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2025-01-01</td>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2025-01-02</td>\n",
       "      <td>102</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2025-01-03</td>\n",
       "      <td>104</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2025-01-04</td>\n",
       "      <td>105</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2025-01-05</td>\n",
       "      <td>106</td>\n",
       "      <td>103.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2025-01-06</td>\n",
       "      <td>107</td>\n",
       "      <td>104.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2025-01-07</td>\n",
       "      <td>108</td>\n",
       "      <td>106.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Date  Close  SMA_5\n",
       "0 2025-01-01    100    NaN\n",
       "1 2025-01-02    102    NaN\n",
       "2 2025-01-03    104    NaN\n",
       "3 2025-01-04    105    NaN\n",
       "4 2025-01-05    106  103.4\n",
       "5 2025-01-06    107  104.8\n",
       "6 2025-01-07    108  106.0"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "\n",
    "# 示例数据（假设df包含‘close’列的DataFrame）\n",
    "data = {\n",
    "    'Date':pd.date_range(start='2025-01-01',periods=20),\n",
    "    'Close':[100,102,104,105,106,107,108,110,112,115,118,120,122,125,128,130,135,140,145,150]\n",
    "}\n",
    "df = pd.DataFrame(data)\n",
    "# 计算5日SMA\n",
    "df['SMA_5'] = df['Close'].rolling(window=5).mean()\n",
    "\n",
    "# 查看结果\n",
    "df[['Date','Close','SMA_5']].head(7)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3d487ff",
   "metadata": {},
   "source": [
    "- 使用TA-Lib函数进行计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3bb1e99e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>ma5</th>\n",
       "      <th>ma10</th>\n",
       "      <th>ma20</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>1533.656</td>\n",
       "      <td>1540.978</td>\n",
       "      <td>1532.9130</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>1529.012</td>\n",
       "      <td>1537.177</td>\n",
       "      <td>1533.4025</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>1530.406</td>\n",
       "      <td>1538.174</td>\n",
       "      <td>1533.5640</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>1530.116</td>\n",
       "      <td>1537.954</td>\n",
       "      <td>1533.5640</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>1527.152</td>\n",
       "      <td>1534.554</td>\n",
       "      <td>1533.4270</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close       ma5      ma10       ma20\n",
       "4   20241225  1530.00  1533.656  1540.978  1532.9130\n",
       "3   20241226  1527.79  1529.012  1537.177  1533.4025\n",
       "2   20241227  1528.97  1530.406  1538.174  1533.5640\n",
       "1   20241230  1525.00  1530.116  1537.954  1533.5640\n",
       "0   20241231  1524.00  1527.152  1534.554  1533.4270"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算5日、10日、20日简单移动平均线\n",
    "data['ma5'] = talib.SMA(data['close'],timeperiod=5)\n",
    "data['ma10'] = talib.SMA(data['close'],timeperiod=10)\n",
    "data['ma20'] = talib.SMA(data['close'],timeperiod=20)\n",
    "\n",
    "# 查看结果\n",
    "data[['trade_date','close','ma5','ma10','ma20']].tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb72cf5a",
   "metadata": {},
   "source": [
    "#### 结果解读\n",
    "通过计算不同周期的移动平均线，可以观察到价格的短期、中期和长期趋势。当短期均线向上穿过长期均线时，可能形成金叉，预示着价格上涨趋势；反之，当短期均线向下穿过长期均线时，可能形成死叉，预示着价格下跌趋势。  \n",
    "### 3.2 指数移动平均线（EMA）\n",
    "#### EMA与MA区别\n",
    "指数移动平均线（Exponential Moving Average, EMA）与简单移动平均线（SMA）的主要区别在于，EMA对近期价格给予更高的权重，使其更能反映最新的价格变化。EMA的计算公式（递归公式）为：\n",
    "$$ EMA_t = \\alpha . x_t+(1-\\alpha) . EMA_{t-1}$$\n",
    "其中：\n",
    "- $EMA_t$:当前时刻的EMA值 \n",
    "- $x_t$:当前时刻的价格（通常用收盘价）\n",
    "- $EMA_{t-1}$:前一时刻的EMA值\n",
    "- $\\alpha$:平滑因子($0\\lt \\alpha \\le 1$)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b13c530",
   "metadata": {},
   "source": [
    "EMA可展开为历史数据的加权求和：  \n",
    "$$ EMA_t = \\alpha . x_t + \\alpha(1-\\alpha).x_{t-1}+\\alpha(1-\\alpha)^2.x_{t-2}+... $$  \n",
    "- 最新数据权重高($\\alpha$)\n",
    "- 历史数据权重按指数衰减（如$\\alpha(1-\\alpha),\\alpha(1-\\alpha)^2$等）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29d5b555",
   "metadata": {},
   "source": [
    "#### Pandas计算指数移动平均线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d5c5511e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Date</th>\n",
       "      <th>Close</th>\n",
       "      <th>EMA_10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2025-01-01</td>\n",
       "      <td>100</td>\n",
       "      <td>100.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2025-01-02</td>\n",
       "      <td>102</td>\n",
       "      <td>100.363636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2025-01-03</td>\n",
       "      <td>104</td>\n",
       "      <td>101.024793</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2025-01-04</td>\n",
       "      <td>105</td>\n",
       "      <td>101.747558</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2025-01-05</td>\n",
       "      <td>106</td>\n",
       "      <td>102.520729</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Date  Close      EMA_10\n",
       "0 2025-01-01    100  100.000000\n",
       "1 2025-01-02    102  100.363636\n",
       "2 2025-01-03    104  101.024793\n",
       "3 2025-01-04    105  101.747558\n",
       "4 2025-01-05    106  102.520729"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "\n",
    "# 示例数据（假设df包含‘close’列的DataFrame）\n",
    "data = {\n",
    "    'Date':pd.date_range(start='2025-01-01',periods=20),\n",
    "    'Close':[100,102,104,105,106,107,108,110,112,115,118,120,122,125,128,130,135,140,145,150]\n",
    "}\n",
    "df = pd.DataFrame(data)\n",
    "# 计算10日EMA（span=10,对应的a=2/(10+1)\n",
    "df['EMA_10'] = df['Close'].ewm(span=10,adjust=False).mean()\n",
    "\n",
    "# 查看结果\n",
    "df[['Date','Close','EMA_10']].head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fdffc8ca",
   "metadata": {},
   "source": [
    "#### TA-Lib计算EMA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "d4512ca3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>ema5</th>\n",
       "      <th>ema10</th>\n",
       "      <th>ema20</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>1534.794550</td>\n",
       "      <td>1536.414392</td>\n",
       "      <td>1536.685890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>1532.459700</td>\n",
       "      <td>1534.846321</td>\n",
       "      <td>1535.838662</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>1531.296467</td>\n",
       "      <td>1533.777899</td>\n",
       "      <td>1535.184504</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>1529.197645</td>\n",
       "      <td>1532.181917</td>\n",
       "      <td>1534.214551</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>1527.465096</td>\n",
       "      <td>1530.694296</td>\n",
       "      <td>1533.241737</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close         ema5        ema10        ema20\n",
       "4   20241225  1530.00  1534.794550  1536.414392  1536.685890\n",
       "3   20241226  1527.79  1532.459700  1534.846321  1535.838662\n",
       "2   20241227  1528.97  1531.296467  1533.777899  1535.184504\n",
       "1   20241230  1525.00  1529.197645  1532.181917  1534.214551\n",
       "0   20241231  1524.00  1527.465096  1530.694296  1533.241737"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算5日、10日、20日指数移动平均线\n",
    "data['ema5'] = talib.EMA(data['close'],timeperiod=5)\n",
    "data['ema10'] = talib.EMA(data['close'],timeperiod=10)\n",
    "data['ema20'] = talib.EMA(data['close'],timeperiod=20)\n",
    "\n",
    "# 查看结果\n",
    "data[['trade_date','close','ema5','ema10','ema20']].tail(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1d595dc",
   "metadata": {},
   "source": [
    "#### EMA在A股趋势判断中的作用\n",
    "EMA由于其对价格变化的敏感性，在趋势判断中有重要作用。在A股市场中，交易者常利用EMA的金叉和死叉信号来制定交易策略。  \n",
    "### 3.3 MACD指标\n",
    "MACD（Moving Average Convergence Divergence）指标由DIF线、DEA线和MACD柱状线组成。其计算公式如下：\n",
    "$$ DIF = EMA_{12} - EMA_{26} $$\n",
    "$$ DEA = EMA(DIF,9) $$\n",
    "$$ MACD = 2 \\times (DIF-DEA) $$\n",
    "其中，$EMA_{12}$和 $EMA_{26}$分别表示12日和26日的指数移动平均线。\n",
    "\n",
    "#### 使用Pandas计算MACD"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c887c751",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>DIF</th>\n",
       "      <th>DEA</th>\n",
       "      <th>BAR</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.159544</td>\n",
       "      <td>0.031909</td>\n",
       "      <td>0.255271</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.202953</td>\n",
       "      <td>0.066118</td>\n",
       "      <td>0.273671</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.394194</td>\n",
       "      <td>0.131733</td>\n",
       "      <td>0.524922</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.619306</td>\n",
       "      <td>0.229248</td>\n",
       "      <td>0.780118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.868391</td>\n",
       "      <td>0.357076</td>\n",
       "      <td>1.022630</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1.133419</td>\n",
       "      <td>0.512345</td>\n",
       "      <td>1.242148</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1.407917</td>\n",
       "      <td>0.691459</td>\n",
       "      <td>1.432916</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1.686708</td>\n",
       "      <td>0.890509</td>\n",
       "      <td>1.592397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1.965683</td>\n",
       "      <td>1.105544</td>\n",
       "      <td>1.720279</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        DIF       DEA       BAR\n",
       "0  0.000000  0.000000  0.000000\n",
       "1  0.159544  0.031909  0.255271\n",
       "2  0.202953  0.066118  0.273671\n",
       "3  0.394194  0.131733  0.524922\n",
       "4  0.619306  0.229248  0.780118\n",
       "5  0.868391  0.357076  1.022630\n",
       "6  1.133419  0.512345  1.242148\n",
       "7  1.407917  0.691459  1.432916\n",
       "8  1.686708  0.890509  1.592397\n",
       "9  1.965683  1.105544  1.720279"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "\n",
    "def calculate_macd(data,short=12,long=26,mid=9):\n",
    "    # 计算EMA\n",
    "    data[f'EMA_{short}'] = data['Close'].ewm(span=short,adjust=False).mean()\n",
    "    data[f'EMA_{long}'] = data['Close'].ewm(span=long,adjust=False).mean()\n",
    "\n",
    "    # 计算DIF\n",
    "    data['DIF'] = data[f'EMA_{short}'] - data[f'EMA_{long}']\n",
    "    # 计算DEA\n",
    "    data['DEA'] = data['DIF'].ewm(span=mid,adjust=False).mean()\n",
    "\n",
    "    # 计算柱状图\n",
    "    data['BAR'] = (data['DIF']-data['DEA'])*2\n",
    "\n",
    "    return data[['DIF','DEA','BAR']]\n",
    "\n",
    "# 示例数据（需包含Close列）\n",
    "df = pd.DataFrame({'Close':[10,12,11,13,14,15,16,17,18,19]})\n",
    "macd_result = calculate_macd(df)\n",
    "macd_result"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2f43477",
   "metadata": {},
   "source": [
    "#### 使用TA-Lib计算MACD"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "028255dd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>dif</th>\n",
       "      <th>dea</th>\n",
       "      <th>bar</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>20241218</td>\n",
       "      <td>1571.50</td>\n",
       "      <td>2.828732</td>\n",
       "      <td>-1.675668</td>\n",
       "      <td>4.504400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>20241219</td>\n",
       "      <td>1551.01</td>\n",
       "      <td>3.415277</td>\n",
       "      <td>-0.657479</td>\n",
       "      <td>4.072756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>20241220</td>\n",
       "      <td>1522.00</td>\n",
       "      <td>1.521712</td>\n",
       "      <td>-0.221641</td>\n",
       "      <td>1.743353</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>20241223</td>\n",
       "      <td>1526.45</td>\n",
       "      <td>0.375794</td>\n",
       "      <td>-0.102154</td>\n",
       "      <td>0.477948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>20241224</td>\n",
       "      <td>1538.82</td>\n",
       "      <td>0.460493</td>\n",
       "      <td>0.010375</td>\n",
       "      <td>0.450118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>-0.181985</td>\n",
       "      <td>-0.028097</td>\n",
       "      <td>-0.153888</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>-0.859573</td>\n",
       "      <td>-0.194392</td>\n",
       "      <td>-0.665181</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>-1.286520</td>\n",
       "      <td>-0.412817</td>\n",
       "      <td>-0.873703</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>-1.923057</td>\n",
       "      <td>-0.714865</td>\n",
       "      <td>-1.208191</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>-2.479625</td>\n",
       "      <td>-1.067817</td>\n",
       "      <td>-1.411808</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close       dif       dea       bar\n",
       "9   20241218  1571.50  2.828732 -1.675668  4.504400\n",
       "8   20241219  1551.01  3.415277 -0.657479  4.072756\n",
       "7   20241220  1522.00  1.521712 -0.221641  1.743353\n",
       "6   20241223  1526.45  0.375794 -0.102154  0.477948\n",
       "5   20241224  1538.82  0.460493  0.010375  0.450118\n",
       "4   20241225  1530.00 -0.181985 -0.028097 -0.153888\n",
       "3   20241226  1527.79 -0.859573 -0.194392 -0.665181\n",
       "2   20241227  1528.97 -1.286520 -0.412817 -0.873703\n",
       "1   20241230  1525.00 -1.923057 -0.714865 -1.208191\n",
       "0   20241231  1524.00 -2.479625 -1.067817 -1.411808"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算MACD\n",
    "data['dif'],data['dea'],data['bar'] = talib.MACD(\n",
    "    data['close'],fastperiod=12,slowperiod=26,signalperiod=9\n",
    ")\n",
    "# 查看结果\n",
    "data[['trade_date','close','dif','dea','bar']].tail(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06f48c06",
   "metadata": {},
   "source": [
    "#### MACD实战：A股买卖信号捕捉\n",
    "在A股市场中，当DIF线从下向上穿过DEA线时，形成金叉，通常被视为买入信号；反之，当DIF线从上向下穿过DEA线时，形成死叉，通常被视为卖出信号。MACD柱状线的颜色和长度变换也能反映市场的多空力量。  \n",
    "## 第四章 动量指标\n",
    "### 4.1 相对强弱指标（RSI）\n",
    "#### RSI计算原理\n",
    "相对强弱指数（Relative Strength Index，RSI）是一种动量指标，用于衡量股票在一定时期内价格变动速度和变化幅度，从而判断股票是处于超买还是超卖状态。RSI的取值范围在0到100之间，通常以14天为计算周期。其计算公式为：\n",
    "$$ RSI = 100 - \\frac{100}{1+RS} $$\n",
    "其中，RS为特定周期内平均上涨点数与平均下跌点数的比值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b2a5b3b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>rsi</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>48.430008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>47.923159</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>48.234673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>47.211442</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>46.941318</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close        rsi\n",
       "4   20241225  1530.00  48.430008\n",
       "3   20241226  1527.79  47.923159\n",
       "2   20241227  1528.97  48.234673\n",
       "1   20241230  1525.00  47.211442\n",
       "0   20241231  1524.00  46.941318"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算14日相对强弱指数\n",
    "data['rsi'] = talib.RSI(data['close'],timeperiod=14)\n",
    "\n",
    "# 查看结果\n",
    "data[['trade_date','close','rsi']].tail(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d9eac70",
   "metadata": {},
   "source": [
    "### 4.2 随机指标（KDJ）\n",
    "#### KDJ指标构成与计算\n",
    "随机指标（Stochastic Oscillator，KDJ）由三条线组成：K线、D线和J线。它主要用来衡量市场的超买和超卖状态和价格动量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "eec05c5f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>k</th>\n",
       "      <th>d</th>\n",
       "      <th>j</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>29.099412</td>\n",
       "      <td>31.749384</td>\n",
       "      <td>23.799467</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>25.765576</td>\n",
       "      <td>32.423191</td>\n",
       "      <td>12.450344</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>19.950000</td>\n",
       "      <td>24.938329</td>\n",
       "      <td>9.973342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>13.333333</td>\n",
       "      <td>19.682970</td>\n",
       "      <td>0.634061</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>13.744355</td>\n",
       "      <td>15.675896</td>\n",
       "      <td>9.881273</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close          k          d          j\n",
       "4   20241225  1530.00  29.099412  31.749384  23.799467\n",
       "3   20241226  1527.79  25.765576  32.423191  12.450344\n",
       "2   20241227  1528.97  19.950000  24.938329   9.973342\n",
       "1   20241230  1525.00  13.333333  19.682970   0.634061\n",
       "0   20241231  1524.00  13.744355  15.675896   9.881273"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算9日最高价和最低价\n",
    "data['high_9'] = data['high'].rolling(window=9).max()\n",
    "data['low_9'] = data['low'].rolling(window=9).min()\n",
    "\n",
    "# 计算K值\n",
    "data['k'] = ((data['close']-data['low_9'])/(data['high_9']-data['low_9']))*100\n",
    "\n",
    "# 计算D值\n",
    "data['d'] = data['k'].rolling(window=3).mean()\n",
    "\n",
    "# 计算J值\n",
    "data['j'] = 3*data['k'] - 2* data['d']\n",
    "\n",
    "# 查看结果\n",
    "data[['trade_date','close','k','d','j']].tail(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd5fa219",
   "metadata": {},
   "source": [
    "#### KDJ实战：A股短期交易信号\n",
    "在A股市场中，当K线从下往上穿过D线时，形成金叉，通常被视为短期买入信号；反之，当K线从上向下穿过D线时，形成死叉，通常被视为短期卖出信号。此外，J值的过高或过低能提供一定的交易提示。  \n",
    "\n",
    "### 4.3 威廉指标（WMS）\n",
    "#### WMS指标介绍\n",
    "威廉指标（Williams %S,WMS）也是一种动量指标，用于衡量市场的超买超卖状态。它与KDJ指标类似，但计算方式有所不同。WMS的取值范围在0到-100之间，通常以14天为计算周期。  \n",
    "#### TA-Lib中WMS函数使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "f436ebb3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>wms</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>-69.397153</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>-75.253550</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>-73.543900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>-78.443204</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>-79.951727</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close        wms\n",
       "4   20241225  1530.00 -69.397153\n",
       "3   20241226  1527.79 -75.253550\n",
       "2   20241227  1528.97 -73.543900\n",
       "1   20241230  1525.00 -78.443204\n",
       "0   20241231  1524.00 -79.951727"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算14日威廉指标\n",
    "data['wms'] = talib.WILLR(data['high'],data['low'],data['close'],timeperiod=14)\n",
    "\n",
    "# 查看结果\n",
    "data[['trade_date','close','wms']].tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "314b2366",
   "metadata": {},
   "source": [
    "#### WMS在A股市场中的实战案例\n",
    "在A股市场，WMS值超过-20通常表示股票处于超买状态，可能出现回调；WMS值低于-80则表示股票处于超卖状态，可能会出现反弹。交易者可以结合WMS与其他指标来提高交易信号的准确性。\n",
    "\n",
    "## 第五章 均量线与成交量指标\n",
    "### 5.1 均量线（VMA）\n",
    "#### VMA计算方法\n",
    "均量线（Volume Moving Average，VMA）是成交量的移动平均线，用于平滑成交量数据，帮助识别成交量的趋势和变化。计算方法与移动平均线类似，可以选择简单移动平均或指数移动平均等方式。\n",
    "#### TA-Lib计算均量线\n",
    "TA-Lib中没有直接的均量线函数，但我们可以利用其移动平均函数来计算。以下是使用简单移动平均（SMA）计算均量线的实例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "d86fefc4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>vol</th>\n",
       "      <th>vma5</th>\n",
       "      <th>vma10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>17123.39</td>\n",
       "      <td>22759.612</td>\n",
       "      <td>33311.754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>18286.51</td>\n",
       "      <td>21455.050</td>\n",
       "      <td>30946.753</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>20759.32</td>\n",
       "      <td>19975.366</td>\n",
       "      <td>28071.488</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>25129.82</td>\n",
       "      <td>20680.792</td>\n",
       "      <td>27330.760</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>39354.45</td>\n",
       "      <td>24130.698</td>\n",
       "      <td>25849.042</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date       vol       vma5      vma10\n",
       "4   20241225  17123.39  22759.612  33311.754\n",
       "3   20241226  18286.51  21455.050  30946.753\n",
       "2   20241227  20759.32  19975.366  28071.488\n",
       "1   20241230  25129.82  20680.792  27330.760\n",
       "0   20241231  39354.45  24130.698  25849.042"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算5日均量线\n",
    "data['vma5'] = talib.SMA(data['vol'],timeperiod=5)\n",
    "# 计算10日均量线\n",
    "data['vma10'] = talib.SMA(data['vol'],timeperiod=10)\n",
    "\n",
    "# 查看结果\n",
    "data[['trade_date','vol','vma5','vma10']].tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bdada98a",
   "metadata": {},
   "source": [
    "#### VMA与A股价格走势关系分析\n",
    "均量线的变化可以反映市场活跃度的趋势。在A股市场中，当均量线向上时，表示市场交投活跃，可能伴随着价格的上涨或下跌趋势的加速；当均量线向下时，表示市场交投趋于清淡，价格走势可能进入盘整阶段。交易者可以通过观察均量线与价格走势的关系，判断市场的强弱和趋势的可持续性。\n",
    "### 5.2 成交量指标（VOL）\n",
    "#### VOL指标的含义\n",
    "成交量指标（Volume，VOL）直接反映了股票在一定时间内的成交手数，是衡量市场活跃度和资金流向的重要指标。在技术分析中，成交量的变化往往预示着价格的潜在变动。\n",
    "#### TA-Lib中VOL相关函数\n",
    "TA-Lib中提供了多种与成交量相关的函数，除了基本的均量线计算外，还可以计算成交量的变动率、累积成交量等。以下示例展示如何计算成交量的简单移动平均和指数移动平均："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "510729f2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>vol</th>\n",
       "      <th>vma5_sma</th>\n",
       "      <th>vma5_ema</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>17123.39</td>\n",
       "      <td>22759.612</td>\n",
       "      <td>23857.465194</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>18286.51</td>\n",
       "      <td>21455.050</td>\n",
       "      <td>22000.480129</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>20759.32</td>\n",
       "      <td>19975.366</td>\n",
       "      <td>21586.760086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>25129.82</td>\n",
       "      <td>20680.792</td>\n",
       "      <td>22767.780058</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>39354.45</td>\n",
       "      <td>24130.698</td>\n",
       "      <td>28296.670038</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date       vol   vma5_sma      vma5_ema\n",
       "4   20241225  17123.39  22759.612  23857.465194\n",
       "3   20241226  18286.51  21455.050  22000.480129\n",
       "2   20241227  20759.32  19975.366  21586.760086\n",
       "1   20241230  25129.82  20680.792  22767.780058\n",
       "0   20241231  39354.45  24130.698  28296.670038"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算5日均量线（简单移动平均）\n",
    "data['vma5_sma'] = talib.SMA(data['vol'],timeperiod=5)\n",
    "# 计算5日均量线（指数移动平均）\n",
    "data['vma5_ema'] = talib.EMA(data['vol'],timeperiod=5)\n",
    "\n",
    "# 查看结果\n",
    "data[['trade_date','vol','vma5_sma','vma5_ema']].tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5b470b0",
   "metadata": {},
   "source": [
    "#### VOL在A股市场中的实战应用\n",
    "在A股市场中，成交量的分析对于判断市场情绪和趋势具有重要意思。当价格上涨且成交量同步放大时，表明市场买盘强劲，上涨趋势可能持续；反之，当价格上涨但成交量萎缩时，可能意味着上涨动力不足，趋势有翻转的风险。此外，通过毕竟不同周期的均量线，可以更清晰地观察成交量的变化趋势，辅助指定交易策略。  \n",
    "\n",
    "## 第六章 布林线与波动性指标\n",
    "### 6.1 布林线（BOLL）\n",
    "#### BOLL计算公式与原理\n",
    "布林线（Bollinger Bands，BOLL）是一种基于标准差的波动性指标，由约翰.布林格（John Bollinger）开发。它由三条线组成：中轨（通常是20日移动平均线）、上轨（中轨加上两倍标准差）和下轨（中轨减去两倍标准差）。其计算公式如下：\n",
    "$$ 中轨 = SMA_{20} $$\n",
    "$$ 上轨 = SMA_{20} + 2\\times \\sigma_{20} $$\n",
    "$$ 下轨 = SMA_{20} - 2\\times \\sigma_{20} $$  \n",
    "其中，$SMA_{20}$表示20日简单移动平均线，$\\sigma_{20}$表示20日收盘价的标准差。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72759409",
   "metadata": {},
   "source": [
    "#### TA-Lib计算布林线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "1f6dc789",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>upper</th>\n",
       "      <th>middle</th>\n",
       "      <th>lower</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>1566.122809</td>\n",
       "      <td>1532.9130</td>\n",
       "      <td>1499.703191</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>1566.001618</td>\n",
       "      <td>1533.4025</td>\n",
       "      <td>1500.803382</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>1566.041450</td>\n",
       "      <td>1533.5640</td>\n",
       "      <td>1501.086550</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>1566.041450</td>\n",
       "      <td>1533.5640</td>\n",
       "      <td>1501.086550</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>1566.041266</td>\n",
       "      <td>1533.4270</td>\n",
       "      <td>1500.812734</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close        upper     middle        lower\n",
       "4   20241225  1530.00  1566.122809  1532.9130  1499.703191\n",
       "3   20241226  1527.79  1566.001618  1533.4025  1500.803382\n",
       "2   20241227  1528.97  1566.041450  1533.5640  1501.086550\n",
       "1   20241230  1525.00  1566.041450  1533.5640  1501.086550\n",
       "0   20241231  1524.00  1566.041266  1533.4270  1500.812734"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算布林线\n",
    "data['upper'],data['middle'],data['lower'] = talib.BBANDS(\n",
    "    data['close'],timeperiod=20,nbdevup=2,nbdevdn=2,matype=0\n",
    ")\n",
    "\n",
    "# 查看结果\n",
    "data[['trade_date','close','upper','middle','lower']].tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c63f6fb",
   "metadata": {},
   "source": [
    "#### BOLL在A股市场中的应用策略\n",
    "在A股市场中，布林线可以用于判断市场的波动性和趋势方向。当价格触及上轨时，可能表示市场除以超买状态，价格有回调的风险；当价格触及下轨时，可能表示市场处于超卖的状态，价格有望反弹。此外，布林线的扩张和收缩也能反映市场的波动性变化。布林线扩张时，市场波动加剧；布林线收缩时，市场进入盘整阶段，波动减小。\n",
    "### 6.2 指数平滑异同移动平均线（MACD）\n",
    "#### MACD与布林线结合使用\n",
    "MACD和布林线结合使用可以提供更全面的市场分析。MACD主要用于趋势判断，而布林线则擅长衡量市场的波动性和炒买炒卖状态。当MACD显示市场处于上涨趋势，同时布林线上轨被突破时，可以增强买入信号的可靠性；反之，当MACD显示下跌趋势时，且布林线下轨被突破时，可以增强卖出信号的可靠性。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75290f93",
   "metadata": {},
   "source": [
    "## 第七章 TA-Lib函数综合应用\n",
    "### 7.1 多指标综合分析\n",
    "#### 选取合适指标组合\n",
    "在实际的交易分析中，单一的技术指标往往存在局限性，容易产生虚假信号。因此，通常需要结合多个指标进行综合分析，以提高信号的准确性和可靠性。常见的指标组合包括趋势指标与动量指标的结合、成交量指标与价格指标的配合等。\n",
    "#### 使用TA-Lib进行多指标计算\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "fbd2b10f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>close</th>\n",
       "      <th>ma5</th>\n",
       "      <th>ema10</th>\n",
       "      <th>rsi</th>\n",
       "      <th>macd</th>\n",
       "      <th>signal</th>\n",
       "      <th>hist</th>\n",
       "      <th>upper</th>\n",
       "      <th>middle</th>\n",
       "      <th>lower</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20241225</td>\n",
       "      <td>1530.00</td>\n",
       "      <td>1533.656</td>\n",
       "      <td>1536.414392</td>\n",
       "      <td>48.430008</td>\n",
       "      <td>-0.181985</td>\n",
       "      <td>-0.028097</td>\n",
       "      <td>-0.153888</td>\n",
       "      <td>1566.122809</td>\n",
       "      <td>1532.9130</td>\n",
       "      <td>1499.703191</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>20241226</td>\n",
       "      <td>1527.79</td>\n",
       "      <td>1529.012</td>\n",
       "      <td>1534.846321</td>\n",
       "      <td>47.923159</td>\n",
       "      <td>-0.859573</td>\n",
       "      <td>-0.194392</td>\n",
       "      <td>-0.665181</td>\n",
       "      <td>1566.001618</td>\n",
       "      <td>1533.4025</td>\n",
       "      <td>1500.803382</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20241227</td>\n",
       "      <td>1528.97</td>\n",
       "      <td>1530.406</td>\n",
       "      <td>1533.777899</td>\n",
       "      <td>48.234673</td>\n",
       "      <td>-1.286520</td>\n",
       "      <td>-0.412817</td>\n",
       "      <td>-0.873703</td>\n",
       "      <td>1566.041450</td>\n",
       "      <td>1533.5640</td>\n",
       "      <td>1501.086550</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20241230</td>\n",
       "      <td>1525.00</td>\n",
       "      <td>1530.116</td>\n",
       "      <td>1532.181917</td>\n",
       "      <td>47.211442</td>\n",
       "      <td>-1.923057</td>\n",
       "      <td>-0.714865</td>\n",
       "      <td>-1.208191</td>\n",
       "      <td>1566.041450</td>\n",
       "      <td>1533.5640</td>\n",
       "      <td>1501.086550</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20241231</td>\n",
       "      <td>1524.00</td>\n",
       "      <td>1527.152</td>\n",
       "      <td>1530.694296</td>\n",
       "      <td>46.941318</td>\n",
       "      <td>-2.479625</td>\n",
       "      <td>-1.067817</td>\n",
       "      <td>-1.411808</td>\n",
       "      <td>1566.041266</td>\n",
       "      <td>1533.4270</td>\n",
       "      <td>1500.812734</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  trade_date    close       ma5        ema10        rsi      macd    signal  \\\n",
       "4   20241225  1530.00  1533.656  1536.414392  48.430008 -0.181985 -0.028097   \n",
       "3   20241226  1527.79  1529.012  1534.846321  47.923159 -0.859573 -0.194392   \n",
       "2   20241227  1528.97  1530.406  1533.777899  48.234673 -1.286520 -0.412817   \n",
       "1   20241230  1525.00  1530.116  1532.181917  47.211442 -1.923057 -0.714865   \n",
       "0   20241231  1524.00  1527.152  1530.694296  46.941318 -2.479625 -1.067817   \n",
       "\n",
       "       hist        upper     middle        lower  \n",
       "4 -0.153888  1566.122809  1532.9130  1499.703191  \n",
       "3 -0.665181  1566.001618  1533.4025  1500.803382  \n",
       "2 -0.873703  1566.041450  1533.5640  1501.086550  \n",
       "1 -1.208191  1566.041450  1533.5640  1501.086550  \n",
       "0 -1.411808  1566.041266  1533.4270  1500.812734  "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data = data.sort_values('trade_date')\n",
    "\n",
    "# 计算多个指标\n",
    "data['ma5'] = talib.SMA(data['close'],timeperiod=5) # 趋势指标：5日简单移动平均价\n",
    "data['ema10'] = talib.EMA(data['close'],timeperiod=10) # 趋势指标：10日指数移动平均价\n",
    "\n",
    "data['rsi'] = talib.RSI(data['close'],timeperiod=14) # 动量指标：相对强弱指标\n",
    "data['macd'],data['signal'],data['hist'] = talib.MACD(\n",
    "    data['close'],fastperiod=12,slowperiod=26,signalperiod=9\n",
    ")  # 趋势指标：macd\n",
    "data['upper'],data['middle'],data['lower'] = talib.BBANDS(\n",
    "    data['close'],timeperiod=20,matype=0\n",
    ") # 布林线\n",
    "\n",
    "# 查看结果\n",
    "data[[\n",
    "    'trade_date',\n",
    "    'close',\n",
    "    'ma5',\n",
    "    'ema10',\n",
    "    'rsi',\n",
    "    'macd',\n",
    "    'signal',\n",
    "    'hist',\n",
    "    'upper',\n",
    "    'middle',\n",
    "    'lower'\n",
    "]].tail()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4288c31",
   "metadata": {},
   "source": [
    "#### 综合分析A股市场走势\n",
    "通过综合多个指标的数据，可以更全面地判断市场的走势和状态。例如，当短期均值（如5日MA）向上穿过长期均线（如10日EMA），同时RSI值从超卖区域回升，MACD柱状线由负转正且dif线向上穿过DEA线，布林线上轨突破时，这些信号共同指向市场处于强势上涨趋势，买入信号较为强烈。相反，当多个指标同时发出卖出信号时，应警惕市场下跌风险，及时调整仓位或止损离场。\n",
    "### 7.2 自定义交易策略实现\n",
    "#### 基于TA-Lib的策略构建思路\n",
    "构建交易策略时，首先需要明确交易目标和风险偏好，然后根据市场特征和历史数据选择合适的技术指标组合，制定清晰的入场、止损和止盈规则。利用TA-Lib强大的计算能力，可以快速实现各种复杂策略的回测和优化。\n",
    "#### 策略代码编写与回测\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "7ed01caa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "初始资金：100000元\n",
      "最终价值：68388.89元\n",
      "收益率：-31.61%\n",
      "交易记录\n",
      "buy 20241114 价格：1573.80 数量：63.0\n",
      "sell 20241031 价格：1527.79 数量：63.0\n",
      "buy 20241010 价格：1640.00 数量：59.0\n",
      "sell 20240924 价格：1372.60 数量：59.0\n",
      "buy 20240905 价格：1404.88 数量：57.0\n",
      "sell 20240802 价格：1385.45 数量：57.0\n",
      "buy 20240723 价格：1455.00 数量：55.0\n",
      "sell 20240709 价格：1438.03 数量：55.0\n",
      "buy 20240627 价格：1490.49 数量：53.0\n",
      "sell 20240425 价格：1693.04 数量：53.0\n",
      "buy 20240402 价格：1713.99 数量：52.0\n",
      "sell 20240306 价格：1680.55 数量：52.0\n",
      "buy 20240222 价格：1718.38 数量：51.0\n",
      "sell 20240206 价格：1676.00 数量：51.0\n",
      "buy 20240110 价格：1641.50 数量：52.0\n",
      "sell 20231220 价格：1649.79 数量：52.0\n",
      "buy 20231208 价格：1704.92 数量：50.0\n",
      "sell 20231114 价格：1765.27 数量：50.0\n",
      "buy 20231106 价格：1812.00 数量：49.0\n",
      "sell 20231030 价格：1681.00 数量：49.0\n",
      "buy 20231013 价格：1751.00 数量：47.0\n",
      "sell 20230911 价格：1822.17 数量：47.0\n",
      "buy 20230906 价格：1861.00 数量：46.0\n",
      "sell 20230823 价格：1774.00 数量：46.0\n",
      "buy 20230810 价格：1875.00 数量：43.0\n",
      "sell 20230725 价格：1828.55 数量：43.0\n",
      "buy 20230620 价格：1743.46 数量：46.0\n",
      "sell 20230609 价格：1666.00 数量：46.0\n",
      "buy 20230524 价格：1710.90 数量：44.0\n",
      "sell 20230420 价格：1741.88 数量：44.0\n",
      "buy 20230417 价格：1753.00 数量：44.0\n",
      "sell 20230411 价格：1745.50 数量：44.0\n",
      "buy 20230406 价格：1796.96 数量：43.0\n",
      "sell 20230323 价格：1774.86 数量：43.0\n",
      "buy 20230307 价格：1788.30 数量：43.0\n",
      "sell 20230208 价格：1784.00 数量：43.0\n",
      "buy 20230130 价格：1888.00 数量：40.0\n",
      "sell 20230109 价格：1841.20 数量：40.0\n",
      "buy 20221214 价格：1770.87 数量：42.0\n",
      "sell 20221208 价格：1687.02 数量：42.0\n",
      "buy 20221114 价格：1533.00 数量：46.0\n",
      "sell 20221108 价格：1484.88 数量：46.0\n",
      "buy 20221021 价格：1624.00 数量：42.0\n",
      "sell 20220906 价格：1845.00 数量：42.0\n",
      "buy 20220725 价格：1944.65 数量：40.0\n",
      "sell 20220622 价格：1936.00 数量：40.0\n",
      "buy 20220429 价格：1828.38 数量：42.0\n",
      "sell 20220331 价格：1719.00 数量：42.0\n",
      "buy 20220308 价格：1753.20 数量：41.0\n",
      "sell 20220114 价格：1867.00 数量：41.0\n",
      "buy 20220106 价格：1982.22 数量：39.0\n",
      "sell 20211217 价格：2050.70 数量：39.0\n",
      "buy 20211102 价格：1804.64 数量：44.0\n",
      "sell 20210929 价格：1820.00 数量：44.0\n",
      "buy 20210813 价格：1700.04 数量：47.0\n",
      "sell 20210521 价格：2042.10 数量：47.0\n",
      "buy 20210427 价格：2094.44 数量：46.0\n",
      "sell 20210412 价格：2008.89 数量：46.0\n",
      "buy 20210402 价格：2162.00 数量：43.0\n",
      "sell 20210326 价格：2013.00 数量：43.0\n",
      "buy 20210302 价格：2058.00 数量：42.0\n",
      "sell 20210202 价格：2145.00 数量：42.0\n",
      "buy 20210111 价格：2099.73 数量：43.0\n",
      "sell 20210105 价格：2059.45 数量：43.0\n",
      "buy 20201106 价格：1700.62 数量：52.0\n",
      "sell 20201027 价格：1625.00 数量：52.0\n",
      "buy 20201020 价格：1734.00 数量：49.0\n",
      "sell 20200928 价格：1661.00 数量：49.0\n",
      "buy 20200916 价格：1725.10 数量：47.0\n",
      "sell 20200825 价格：1727.00 数量：47.0\n",
      "buy 20200731 价格：1678.18 数量：48.0\n",
      "sell 20200724 价格：1595.30 数量：48.0\n",
      "buy 20200717 价格：1648.05 数量：47.0\n",
      "sell 20200706 价格：1600.00 数量：47.0\n",
      "buy 20200311 价格：1158.52 数量：65.0\n",
      "sell 20200207 价格：1076.00 数量：65.0\n",
      "buy 20200117 价格：1107.50 数量：63.0\n",
      "sell 20200103 价格：1078.56 数量：63.0\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/YAAAIjCAYAAACpnIB8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3QWYXOXVB/D/HZ9Z9427O0mAAAkJRQu0UKAt7tLiUFxKCZQWKcVpcT6KuxNiJCGuxHUtsu47PnO/533fsZUkm2Q1+//xzDN2Z/aOZNlzz3nP0XRd10FEREREREREnZKhvXeAiIiIiIiIiA4eA3siIiIiIiKiToyBPREREREREVEnxsCeiIiIiIiIqBNjYE9ERERERETUiTGwJyIiIiIiIurEGNgTERERERERdWIM7ImIiIiIiIg6MQb2RERERERERJ0YA3siIqKQyy67DH379sXhSrw28Ro7qjfffBOapiE3Nzdy29SpU+WpI2tqv9vT4f49JiKixhjYExHRYSEcXIVPNpsNgwcPxg033ICioqL23r1OQQSEse/h3k4d+eBAS/J6vXjmmWcwbtw4JCYmIjk5GSNGjMA111yDTZs2tffuERERRZiiF4mIiDq/hx9+GP369YPb7caCBQvw0ksv4dtvv8W6devgcDj2+dhXXnkFwWAQXdW1116LE088MXI9JycHDz74oAxkJ0+eHLl9wIABbbZPM2bMQHs555xz8N133+H888/H1VdfDZ/PJwP6r7/+GscccwyGDh0qt7v44ovxxz/+EVartd32lYiIujYG9kREdFg57bTTMGHCBHn5qquuQlpaGv71r3/hiy++kAFaU+rq6hAXFwez2YyubNKkSfIUtnz5chnYi9suuuiivT4u/P61BovFgvawbNkyGcA/+uijuPfee+vd9/zzz6OysjJy3Wg0yhMREVF7YSk+EREd1k444YRI9lkQZeTx8fHYvn07fv3rXyMhIQEXXnjhXtcmiwy+KMceNWqULO/PyMjAqaeeKoPeWO+88w7Gjx8Pu92O1NRUmcEtKCjY7/7l5eXhz3/+M4YMGSIfKw5EnHfeeY3Wa4eXGvz888+47bbb5H6IYPrss89GSUlJvW11XccjjzyCnj17yiqFadOmYf369WgJ4f346aef5H5nZmbKn3Mgr0UQ+yM+G7GdeLzY36aqJRqusZ87d678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LsW4ceNgs9kwYcIErFq1qt79gUAAV155Jfr16we73Y4hQ4bgmWeeidw/b948mM1mGYzHuuWWWzB58uR9/uwLL7wQP/30EwoKCiK3iYBd3C5eS0NiW5fLhYcffhjV1dVYuHAhOovGr4aIiIiIiLoMX0ww72MpftvzOYG/d2+fn33vbsDSdOa6KVu3bkX37t1lkD5p0iRZtt67d++9bl9bW4szzjgDJ510Et555x3k5OTg5ptvrrdNMBhEz5498dFHHyEtLU0G09dccw26deuG3//+95gyZQr69++P//u//8Mdd9whH+Pz+fC///0Pjz/++D73NysrC6eccgreeust3H///XA6nfjggw9kAP/222832v61117D+eefLw8kiHNx/ZhjjkFnwIw9EREREVEX5vNHg3k2z6O9Oeqoo+Sa9O+//x4vvfSSDNJFxrympmavj3n33Xdl4C4CZFHGL4L8cHAeJoLov/3tbzKbL7L2Ipt++eWX48MPP4xsIzL6sSX1X331Fdxutwz89+eKK66Q+63rOj7++GMMGDAAY8eObbSdyNCL+y+66CJ5XZyLfRAHJzoDZuyJiIiIiLowfzAmsGfGvu2ZHSpz3l4/u5lOO+20yOXRo0fLQL9Pnz4y+BWB93XXXSez8mEiIN64caPcVmT4w0Smv6EXXnhBlsjn5+fLUniv11sv+L7ssstkxl2sjz/66KNloC6C+r2tk491+umn49prr5Ul/eJniEC/Ke+9954M+seMGSOvi58vXp/I8IvX19ExsCciIiIi6sJiG+YxY98ONO2AyuE7iuTkZAwePBjbtm2T18W69L/85S8H/Dyia7143FNPPSWD/oSEBNmRfsmSJZFtMjMzceaZZ8qsvcjqf/fdd5g7d26znt9kMuHiiy/GX//6V/mcn332WZPbiaqC9evX11t7L6oNxMEABvZERERERNSJMvYM7Kl5REZ++/btMmgOB9/iFGvYsGFybbwomw9n7UXWPdbPP/8s17H/+c9/jtwmnrehq666Sq57F+vxRWb92GOPbfa+XnHFFXjyySfxhz/8ASkpKY3uX7t2LZYvXy4PFqSmpkZuLy8vx9SpU7Fp06YOPdpP4Bp7IiIiIqIuzOePaZ4XE+QTxRJZddF0Ljc3Vza4O/vss+W8dxFs780FF1wg58VfffXV2LBhA7799lsZYMcaNGiQDKp/+OEHbNmyBQ888ACWLVvW6LlEE7zExEQ88sgjcg3+gRg2bBhKS0sbjb6LzdYfeeSRslHfyJEjIydxfeLEifL+jo6BPRERERFRFxYbzHPcHe3Nzp07ZRAvxtGJ9e2ig73IvmdkZOz1MfHx8bLRnciIi5F39913H/75z3/W20asf//d734ns+li3X5ZWVm97H2YwWCQa+3FeLxLLrnkgPc/LS1NjtNrSKznF70BzjnnnCYfJ24XHfRFJ/6OTNNFe0DaL9ElMSkpCVVVVfJIERERERHR4eDM5xZg7a4qefndq4/CMQP2P5ucDp4oSxcd5cVa8dimcrR/Yq17SUkJvvzyS3SV70R1M+NQrrEnIiIiIurCYmfXc409dUQiqBVZfzE+73AL6lsKA3siIiIioi6sXmDPNfbUAf32t7/F0qVL5Ui9k046qb13p0NiYE9ERERE1IXFjrhjxp46ouaOtuvK2DyPiIiIiKgLiw3mOceeqHNiYE9ERERE1IXFluLHXiaizoOBPRERERFRF8bmeUSdHwN7IiIiIqIuLDaY5xx7os6JgT0RERERURfmC3XC76ftQVrxwvbeHSI6COyKT0RERETURfkDQfhCGfs51tuBZQAmjAKyhrf3rhHRAWDGnoiIiIioi9q4p0aW38fDGb2xZGN77hKRHG+naRoqKyvbe1c6DQb2RERERERd1JKcMnk+SNsVvdHvbb8dog5r3rx5OPPMM9G9e3cZdH/++eeNttF1HQ8++CC6desGu92OE088EVu3bkVHpWlak6f333+/3gGGlJQUuN3ueo9dtmxZZPumDB06FFarFYWFhW3yWhjYExERERF1UasLVEZ0oCEmsK8rbr8dog6rrq4OY8aMwQsvvLDXbR5//HE8++yzePnll7FkyRLExcXhlFNOaRQUdyRvvPEG9uzZU+901lln1dsmISEBn332Wb3bXnvtNfTu3bvJ51ywYAFcLhfOPfdcvPXWW2gLDOyJiIiIiLoolzcgz4fEBva1DOzbkshyO33OdjmJn91cp512Gh555BGcffbZe30d//73v3H//ffjt7/9LUaPHo23334bu3fvbjK7H+vbb7/F4MGDZZZ/2rRpyM3NrXd/WVkZzj//fPTo0QMOhwOjRo3Ce++9F7n/7bffRlpaGjweT73HiQD94osv3ufPTk5ORnZ2dr2TzWart82ll16K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",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import talib\n",
    "import matplotlib.pyplot as plt \n",
    "\n",
    "data = pd.read_parquet(\"./data/600519.SH.parquet\")\n",
    "# 确保数据按时间顺序排列\n",
    "data.set_index(\"trade_date\",inplace=True)\n",
    "\n",
    "# 计算指标\n",
    "data['ma5'] = talib.SMA(data['close'],timeperiod=5)\n",
    "data['ema10'] = talib.EMA(data['close'],timeperiod=10)\n",
    "data['rsi'] = talib.RSI(data['close'],timeperiod=14)\n",
    "data['macd'],data['signal'],data['hist'] = talib.MACD(\n",
    "    data['close'],fastperiod=12,slowperiod=26,signalperiod=9\n",
    ")\n",
    "\n",
    "# 定义交易信号\n",
    "data['buy_signal'] = (\n",
    "    (data['ma5']>data['ema10']) & (data['rsi']<70) & (data['macd']>data['signal'])\n",
    ")\n",
    "data['sell_signal'] = (\n",
    "    (data['ma5']<data['ema10']) & (data['rsi']>30) & (data['macd']<data['signal'])\n",
    ")\n",
    "\n",
    "# 回测策略\n",
    "initial_captital = 100000 # 初试资金\n",
    "position = 0 # 当前持仓\n",
    "cash = initial_captital # 当前现金\n",
    "trades = [] # 交易记录\n",
    "\n",
    "for i in range(len(data)):\n",
    "    if position == 0 and data['buy_signal'].iloc[i]:\n",
    "        # 买入信号\n",
    "        position = cash // data['close'].iloc[i]\n",
    "        cash -= position*data['close'].iloc[i]\n",
    "        trades.append(('buy',data.index[i],data['close'].iloc[i],position))\n",
    "    elif position>0 and data['sell_signal'].iloc[i]:\n",
    "        # 卖出信号\n",
    "        cash += position*data['close'].iloc[i]\n",
    "        trades.append(('sell',data.index[i],data['close'].iloc[i],position))\n",
    "        position=0\n",
    "\n",
    "# 计算最终收益\n",
    "final_value = cash + position*data['close'].iloc[-1]\n",
    "returns = (final_value - initial_captital)/initial_captital * 100\n",
    "\n",
    "# 输出结果\n",
    "print(f\"初始资金：{initial_captital}元\")\n",
    "print(f\"最终价值：{final_value:.2f}元\")\n",
    "print(f\"收益率：{returns:.2f}%\")\n",
    "print(\"交易记录\")\n",
    "for trade in trades:\n",
    "    print(f\"{trade[0]} {trade[1]} 价格：{trade[2]:.2f} 数量：{trade[3]}\")\n",
    "\n",
    "# 绘制价格走势与交易信号\n",
    "plt.figure(figsize=(12,6))\n",
    "plt.plot(data['close'],label='Close Price')\n",
    "plt.plot(data['ma5'],label='5-day MA')\n",
    "plt.plot(data['ema10'],label='10-day EMA')\n",
    "for trade in trades:\n",
    "    if trade[0] == \"buy\":\n",
    "        plt.scatter(trade[1],trade[2],color='green',marker='^',s=100)\n",
    "    else:\n",
    "        plt.scatter(trade[1],trade[2],color='red',marker='v',s=100)\n",
    "        \n",
    "plt.title(\"Price and Trading Signals\")\n",
    "plt.xlabel(\"Date\")\n",
    "plt.ylabel(\"Price\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c65b1e06",
   "metadata": {},
   "source": [
    "#### 策略优化与改进\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "da",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
